package cn.buddha.jesdp.proxy.demo;

import sun.misc.ProxyGenerator;

import java.lang.reflect.Proxy;

/**
 * @author shihao
 * @version 1.0
 * @className DynamicProxyTest
 * @description 动态代理测试
 * @date 2022/1/8 0008 16:16
 **/
public class DynamicProxyTest {

    public static void main(String[] args) {
        PayProxyHandler payProxyHandler = new PayProxyHandler(new AliPay());

        /**
         * 将该参数设置为 true，那么在
         *      {@link sun.misc.ProxyGenerator#generateProxyClass(String, Class[])}
         * 方法中就会将动态代理类的字节码文件保存到磁盘上。
         */
        System.setProperty("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");

        // 生成 Pay 接口的动态代理类 $Proxy0.class
        Pay pay = (Pay) Proxy.newProxyInstance(Pay.class.getClassLoader(), new Class[]{Pay.class}, payProxyHandler);
        /**
         * 这里其实调用的是 动态代理类的 payTheBill() 方法（因为动态代理类会实现接口 Pay，从这里也说明了其实跟 静态代理一模一样）。
         * 然后在代理类的 payTheBill() 方法中又会去调用 PayProxyHandler 的 invoke() 方法。
         */
        pay.payTheBill();
    }

}
